#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // 1. 读取图像
    Mat image = imread("黑马.jpg");
    if (image.empty()) {
        cout << "无法加载图像！" << endl;
        return -1;
    }

    // 2. 转换到HSV颜色空间
    Mat hsv;
    cvtColor(image, hsv, COLOR_BGR2HSV);

    // 3. 定义颜色范围（HSV空间）
    // 黑色范围（低饱和度、低亮度）
    Scalar black_lower(0, 0, 0);
    Scalar black_upper(180, 255, 50);
    
    // 红色范围（注意HSV的环型特性）
    Scalar red_lower1(0, 50, 50);    // 红色下限1
    Scalar red_upper1(10, 255, 255);
    Scalar red_lower2(160, 50, 50);  // 红色下限2
    Scalar red_upper2(180, 255, 255);

    // 4. 颜色分割
    Mat black_mask, red_mask1, red_mask2, red_mask;
    inRange(hsv, black_lower, black_upper, black_mask);
    inRange(hsv, red_lower1, red_upper1, red_mask1);
    inRange(hsv, red_lower2, red_upper2, red_mask2);
    
    // 合并红色掩码
    red_mask = red_mask1 | red_mask2;

    // 5. 形态学操作（优化参数）
    Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));
    morphologyEx(black_mask, black_mask, MORPH_OPEN, kernel);
    morphologyEx(red_mask, red_mask, MORPH_OPEN, kernel);
    morphologyEx(black_mask, black_mask, MORPH_CLOSE, kernel);
    morphologyEx(red_mask, red_mask, MORPH_CLOSE, kernel);

    // 6. 合并红黑掩码
    Mat combined_mask = black_mask | red_mask;

    // 7. 查找轮廓并筛选
    vector<vector<Point>> contours;
    findContours(combined_mask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    vector<vector<Point>> valid_contours;
    for (const auto& contour : contours) {
        double area = contourArea(contour);
        Rect rect = boundingRect(contour);
        double aspect_ratio = (double)rect.width / rect.height;

        // 优化筛选条件
        if (area > 200 && aspect_ratio > 0.7 && aspect_ratio < 1.4) {
            valid_contours.push_back(contour);
        }
    }

    // 8. 绘制检测结果
    Mat result = image.clone();
    for (const auto& contour : valid_contours) {
        // 计算质心并标记
        Moments m = moments(contour);
        if (m.m00 != 0) {
            Point center(m.m10 / m.m00, m.m01 / m.m00);
            circle(result, center, 5, Scalar(0, 255, 0), -1); // 用绿色点标记
        }
        
        // 绘制轮廓
        drawContours(result, vector<vector<Point>>{contour}, -1, Scalar(0, 0, 255), 2);
    }

    // 创建填充掩码（白色区域为保留部分）
    Mat mask = Mat::zeros(image.size(), CV_8UC1);
    drawContours(mask, valid_contours, -1, Scalar(255), FILLED);
    
    // 应用掩码裁剪（保留轮廓内区域）
    Mat cropped_image;
    bitwise_and(image, image, cropped_image, mask);
 
    // ================= 新增显示窗口 =================
    imshow("原始图像", image);
    imshow("检测结果", result);
    imshow("裁剪结果", cropped_image);  // 新增显示窗口
    // ================================================
	waitKey(0);


    return 0;
}
